A biblioteca cURL do PHP nos auxilia a buscar informações em outro sites, possibilitando a obtenção de dados remotos, como criação de WEB Services, bots de busca etc.
Vamos começar com um simples exemplo, acessando o site do Google e exibindo o conteúdo obtido.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // página que desejamos acessar $pagina = 'http://www.google.com.br'; // iniciamos uma instância do cURL $ch = curl_init(); // definimos a URL a ser acessada curl_setopt( $ch, CURLOPT_URL, $pagina ); // executamos a ação curl_exec( $ch ); // encerramos a instância do cURL curl_close( $ch ); |
Caso queira, em vez de exibir o conteúdo, retorná-lo a uma variável, para um tratamento de string, por exemplo, basta usar a opção RETURNTRANSFER. O código ficará assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $pagina = 'http://www.google.com.br'; $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $pagina ); // define que o conteúdo obtido deve ser retornado em vez de exibido curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); $retorno = curl_exec( $ch ); curl_close( $ch ); // trocamos a palavra "Google" por "Beraldo" echo preg_replace( "/google/i", "Beraldo", $retorno ); |
Será exibido o conteúdo, porém, com a palavra “Beraldo” substituindo todas as palavras “Google”.
Há diversas opções para usar com a função curl_setopt. Veja a lista completa no link da documentação dessa função.
Por padrão, o cURL não segue redirecionamentos. Por exemplo, se houver um header(“Location: url”);, o redirecionamento não será feito. Para contornar isso, usamos a opção CURLOPT_FOLLOWLOCATION. Usarei o site www.google.com para testar. Experimente retirar esta última opção inserida e veja que a página em português não e exibida.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $pagina = 'http://www.google.com'; $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $pagina ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // define que deve-se seguir redirecionamentos curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true ); $retorno = curl_exec( $ch ); curl_close( $ch ); echo preg_replace( "/google/i", "Beraldo", $retorno ); |
Os exemplos acima poderiam perfeitamente funcionar com funções de manipulação de arquivos, como file_get_contents. Porém, essas funções não podem executar requisições com método POST. É aí que entra o cURL! :)
A opção CURLOPT_POST define que a requisição será pelo método POST. Para definir os campos da requisição, usaremos CURLOPT_POSTFIELDS. Vamos a um exemplo simples:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // campos da requisição POST $postfields = array( 'nome' => 'Beraldo', 'site' => 'www.rberaldo.com.br' ); // página que receberá a requisição post $pagina = 'http://localhost/tmp/curl/post.php'; $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $pagina ); curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $postfields ); curl_exec( $ch ); curl_close(); |
Código do arquivo post.php:
1 | print_r( $_POST ); |
Isso mostrará os campos que definimos no nosso script de cURL.
Podemos usar a opção CURLOPT_HEADER para incluir na saída o cabeçalho da página. Por exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // campos da requisição POST $postfields = array( 'nome' => 'Beraldo', 'site' => 'www.rberaldo.com.br' ); // página que receberá a requisição post $pagina = 'http://localhost/tmp/curl/post.php'; $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $pagina ); curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $postfields ); // define que o cabeçalho deve ser incluso na saída da requisição curl_setopt( $ch, CURLOPT_HEADER, true ); curl_exec( $ch ); curl_close(); |
É possível, inclusive, enviar arquivos por cURL, via POST. Basta incluir mais um campo e inserir o arroba (@) antes do caminho completo do arquivo. Por exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // campos da requisição POST $postfields = array( 'nome' => 'Beraldo', 'site' => 'www.rberaldo.com.br', 'arquivo' => '@/tmp/imagem.jpg' ); // página que receberá a requisição post $pagina = 'http://localhost/tmp/curl/post.php'; $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $pagina ); curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $postfields ); curl_setopt( $ch, CURLOPT_HEADER, true ); curl_exec( $ch ); curl_close( $ch ); |
Se você inserir um print_r( $_FILES ); no post.php, verá os dados do arquivo enviado. ;)
Unindo as duas últimas opções (POST e HEADER), podemos falar sobre login usando cURL. Sim, é possível, inclusive, fazer login em sites usnado cURL. Afinal, essa biblioteca pode perfeitamente simular um navegador ou um bot de busca.
Primeiro vamos incluir a criação de um cookie no nosso arquivo post.php, deixando-o da seguinte forma:
1 2 | setcookie( "test", "valor do cookie de teste", time() + 3600 ); print_r( $_POST ); |
E o nosso script de cURL passará a receber o valor do cookie que deve ser salvo no navegador.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // campos da requisição POST $postfields = array( 'nome' => 'Beraldo', 'site' => 'www.rberaldo.com.br' ); // página que receberá a requisição post $pagina = 'http://localhost/tmp/curl/post.php'; $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $pagina ); curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $postfields ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_HEADER, true ); $retorno = curl_exec( $ch ); curl_close( $ch ); preg_match( "/Set-Cookie:([^\n]+)/i", $retorno, $matches ); $cookie = $matches[1]; echo $cookie; |
A variável $cookie conterá o valor do cookie que deve ser salvo no navegador. Para salvar esse cookie, usamos a opção CURLOPT_COOKIE. Tendo esse valor salvo numa variável, basta fazer isto no script que se conecta a uma página que exija esse cookie:
1 | curl_setopt( $ch, CURLOPT_COOKIE, $cookie ); |
Na documentação das funções cURL (especialmente na da função curl_setopt) é possível encontrar muitas outras funcionalidades para a cURL. É possível definir cabeçalhos de navegador, idioma, usar SSL, proxy e muito mais.
Lista de funções da cURL:
http://www.php.net/manual/pt_BR/ref.curl.php
Roberto Beraldo
Latest posts by Roberto Beraldo (see all)
- Não Tenha Preguiça de Ler! - 25/04/2016
- Como Atualizar Scripts PHP de MySQL Para MySQLi - 29/10/2015
- Como usar PDO com banco de dados MySQL - 10/09/2015